xen: Pause domain when changing debug status.
authorkfraser@localhost.localdomain <kfraser@localhost.localdomain>
Thu, 29 Mar 2007 12:29:24 +0000 (13:29 +0100)
committerkfraser@localhost.localdomain <kfraser@localhost.localdomain>
Thu, 29 Mar 2007 12:29:24 +0000 (13:29 +0100)
Signed-off-by: Keir Fraser <keir@xensource.com>
xen/common/domctl.c

index a9e4402a38a043d90e0b19a35763c41761caf48c..952c419f1ded20f21f8a64da1ecaf5e2707aef57 100644 (file)
@@ -620,29 +620,33 @@ long do_domctl(XEN_GUEST_HANDLE(xen_domctl_t) u_domctl)
     case XEN_DOMCTL_setdomainhandle:
     {
         struct domain *d;
+
         ret = -ESRCH;
         d = rcu_lock_domain_by_id(op->domain);
-        if ( d != NULL )
-        {
-            memcpy(d->handle, op->u.setdomainhandle.handle,
-                   sizeof(xen_domain_handle_t));
-            rcu_unlock_domain(d);
-            ret = 0;
-        }
+        if ( d == NULL )
+            break;
+
+        memcpy(d->handle, op->u.setdomainhandle.handle,
+               sizeof(xen_domain_handle_t));
+        rcu_unlock_domain(d);
+        ret = 0;
     }
     break;
 
     case XEN_DOMCTL_setdebugging:
     {
         struct domain *d;
+
         ret = -ESRCH;
         d = rcu_lock_domain_by_id(op->domain);
-        if ( d != NULL )
-        {
-            d->debugger_attached = !!op->u.setdebugging.enable;
-            rcu_unlock_domain(d);
-            ret = 0;
-        }
+        if ( d == NULL )
+            break;
+
+        domain_pause(d);
+        d->debugger_attached = !!op->u.setdebugging.enable;
+        domain_unpause(d); /* causes guest to latch new status */
+        rcu_unlock_domain(d);
+        ret = 0;
     }
     break;